//class A {
//    public synchronized void foo(B b) {
//        System.out.println("当前线程名: " + Thread.currentThread().getName()
//                + " 进入了A实例的foo方法"); // ①
//        try {
//            Thread.sleep(200);
//        } catch (InterruptedException ex) {
//            ex.printStackTrace();
//        }
//        System.out.println("当前线程名: " + Thread.currentThread().getName()
//                + " 企图调用B实例的last方法"); // ③
//        b.last();
//    }
//
//    public synchronized void last() {
//        System.out.println("进入了A类的last方法内部");
//    }
//}
//
//class B {
//    public synchronized void bar(A a) {
//        System.out.println("当前线程名: " + Thread.currentThread().getName()
//                + " 进入了B实例的bar方法"); // ②
//        try {
//            Thread.sleep(200);
//        } catch (InterruptedException ex) {
//            ex.printStackTrace();
//        }
//        System.out.println("当前线程名: " + Thread.currentThread().getName()
//                + " 企图调用A实例的last方法"); // ④
//        a.last();
//    }
//
//    public synchronized void last() {
//        System.out.println("进入了B类的last方法内部");
//    }
//}
//
//public class DeadLock implements Runnable {
//    A a = new A();
//    B b = new B();
//
//    public void init() {
//        Thread.currentThread().setName("主线程");
//        // 调用a对象的foo方法
//        a.foo(b);
//        System.out.println("进入了主线程之后");
//    }
//
//    public void run() {
//        Thread.currentThread().setName("副线程");
//        // 调用b对象的bar方法
//        b.bar(a);
//        System.out.println("进入了副线程之后");
//    }
//
//    public static void main(String[] args) {
//        DeadLock dl = new DeadLock();
//        new Thread(dl).start();
//        dl.init();
//    }
//}

import java.util.concurrent.locks.ReentrantLock;

class Window implements Runnable {
    // 1. 创建Lock的实例，必须确保多个线程共享同一个Lock实例
    private final ReentrantLock lock = new ReentrantLock();
    int ticket = 100;

    public void run() {

        while (true) {
            try {
                // 2. 调动lock()，实现需共享的代码的锁定
                lock.lock();
                if (ticket > 0) {
                    try {
                        Thread.sleep(10);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(ticket--);
                } else {
                    break;
                }
            } finally {
                // 3. 调用unlock()，释放共享代码的锁定
                lock.unlock();
            }
        }
    }
}

public class DeadLock {
    public static void main(String[] args) {
        Window t = new Window();
        Thread t1 = new Thread(t);
        Thread t2 = new Thread(t);

        t1.start();
        t2.start();
    }
}